La congelación

Pero ¿cómo obtener el estado de un objeto para expresarlo como array? Como explica Sebastian Bergmann en Cool Objects Sleep in Couch, es posible, a través de la API de reflexión y las funciones de serialización, acceder al estado completo de un objeto, tanto para lectura como para escritura. Además, añade un importante detalle: el método constructor de los objetos no es invocado cuando el objeto se descongela, algo que tiene mucho sentido desde el punto de vista conceptual y que el patrón DAO y similares suelen omitir. Esto es posible ya que para descongelar objetos, una vez recuperado el array de la base de datos, Object Freezer los expresa como cadena serializada, y emplea la función unserialize() para crear dicho objeto, de forma que el método mágico __wakeup() es llamado en la descongelación.


//Congelación
$reflector = new ReflectionObject($object);
$state = array();
foreach ($reflector->getProperties() as $attribute) {
    $attribute->setAccessible(TRUE); //Disponible a partir de PHP 5.3
    $state[$attribute->getName()] = $attribute->getValue($object);
}

//Descongelación
$object = unserialize(
  sprintf(
    'O:%d:"%s":0:{}', strlen($className), $className
  )
);